using System;
using Unity.Collections;
using UnityEngine;

//添加了 [Serializable] 特性，使得该类可以在编辑器中序列化。
[System.Serializable]
//添加了 [ExecuteInEditMode] 特性，使得该脚本在编辑模式下也可以执行。
[ExecuteInEditMode]

// 用于唯一标识的MonoBehaviour类。
public class UniqueID : MonoBehaviour
{

    // 使用ReadOnly和SerializeField属性，将_id标记为只读字段，并在Unity编辑器中显示。
    [ReadOnly, SerializeField] private string _id;

    // 使用SerializeField属性，将idDatabase标记为可序列化字段，并在Unity编辑器中显示。
    [SerializeField] private static SerializableDictionary<string, GameObject> idDatabase = new SerializableDictionary<string, GameObject>();

    // 获取_id字段的值。
    public string ID => _id;

    private void Awake()
    {
        if (idDatabase == null) idDatabase = new SerializableDictionary<string, GameObject>();
        if (idDatabase.ContainsKey(_id)) Generate();
        else idDatabase.Add(_id, gameObject);
    }

    // 当对象被销毁时触发的事件函数。
    private void OnDestroy()
    {
        if (idDatabase.ContainsKey(_id))
        {
            idDatabase.Remove(_id);
        }
    }

    [ContextMenu("生成ID")]
    // 生成唯一标识ID，将其添加到idDatabase中，并更新_id字段。
    private void Generate()
    {
        _id = Guid.NewGuid().ToString();
        idDatabase.Add(_id, gameObject);
    }
}
